home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / dev / lang / SML.lha / sml / Programs / faktor < prev    next >
Encoding:
Text File  |  1991-12-12  |  1.2 KB  |  41 lines

  1. datatype faktor = single of int | potenz of int*int;
  2. datatype zerlegung = prim | zgs of faktor list;
  3.  
  4. fun zerlege n =
  5.    let fun zer'(n,d) =
  6.       if d*d>n
  7.          then zgs [single n]
  8.          else
  9.            if n mod d = 0
  10.              then case zer'(n div d,d) of
  11.                    zgs ((single f)::t)  =>
  12.                        if f=d then zgs ((potenz (f,2))::t)
  13.                               else zgs ((single d)::(single f)::t) |
  14.                    zgs ((ff as potenz (f,e))::t) =>
  15.                        if f=d then zgs ((potenz (f,e+1))::t)
  16.                               else zgs ((single d)::ff::t)
  17.              else zer'(n,d+1)
  18.    in
  19.    case zer'(n,2) of
  20.       zgs [single _] => prim |
  21.       all            => all
  22. end;
  23.  
  24. fun pr_faktor (single n) = makestring n
  25.   | pr_faktor (potenz (n,e)) = makestring n ^ "^" ^ makestring e;
  26.  
  27. fun pr_zerl prim = "Prim"
  28.   | pr_zerl (zgs [fak]) = pr_faktor fak
  29.   | pr_zerl (zgs (fak::t)) = pr_faktor fak ^ " * " ^ pr_zerl (zgs t);
  30.  
  31.  
  32. fun primes n =
  33.    let val p = open_out "CON:300/40/300/200/Primfaktoren"
  34.        val z = ref 2
  35.    in
  36.    while !z <= n do
  37.       (output(p,makestring (!z)^" = "^pr_zerl(zerlege(!z))^"\n");inc z);
  38.    close_out p
  39. end;
  40.  
  41.